//
// Created by dqchen on 2022/12/12.
//

#ifndef QUEST_0_1_PARSER_H
#define QUEST_0_1_PARSER_H
#include "lexer.h"
#include "symbol.h"
#include "symtab.h"

class Parser {
    Lexer &lexer;   //词法解析器
    Token *token;   //词法标记
    Symtab &symtab;     //符号表
    OrderGenerator &generator;  //中间代码生成器
private:
    void next();        //向后读取一个词法标记
    void program();     //先解析主程序
    void cdsmt();       //再解析代码段
    Tag defType();
    void define(Tag t);
    void defOne(Tag t, string idName, bool ptr);
    void defVar(Tag t, vector<string>& ids, bool ptr);
    Var* idVar();
    void defList(Tag t, vector<string>& ids, bool ptr);
    void defFun(Tag t, string name);
    void defFunImpl(Func* f);
    void defStatmt();
    void defFramgment();
    void defLocalval();
    void defParams(vector<Var*>& params);
    Var* assign();
    Var* expr();
    Var* addexpr();
    Var* iterm();
    Var* itermpart(Var* var);
    Var* factor();
    Var* valpart();
    Var* addpart(Var* var);
    Var* val();
    Var* funcallexpr(string name, Func* func);
    Var* defStruct(bool global);
    void defStructVar(Var *var);
    void structcall(string name);

public:
    void process();     //语法处理入口
    Parser(Lexer &lexer1, Symtab &symtab1, OrderGenerator &generator1);
    ~Parser();

};


#endif //QUEST_0_1_PARSER_H
